#include <iostream>
#include "Config.hpp"
#include "ClientRegistrar.hpp"
#include "ClientManager.hpp"
#include "RequestManager.hpp"
#include "ClientChecker.hpp"
#include "Types.hpp"

/**
 * @mainpage
 * @author Marcin Ciechowicz
 * Main Loop for Net-Spy
 * 
*/


using namespace netspy;

int main(int argc, char* argv[])
{
	// załadowanie domyślnej konfiguracji
	Config &config = Config::getInstance();

	try
	{
		// ew. zczytanie dodatkowego info z linii poleceń
		config.parseCommandLine(argc,argv);

		// singletony incjalizowane/uruchamiane w jednym wątku
		// żeby uniknąć problemów z synchronizacja

		ClientManager::getInstance().initialize(); // ladowanie informacji z bazy danych
		RequestManager::getInstance().run(); // uruchomienie zarzadcy komunikatow
		ClientRegistrar::getInstance().setPort(config.getRegisterPort());
		ClientRegistrar::getInstance().run(); // uruchomienie Rejstratora Klientów

		ClientChecker::getInstance().runCheckers(config.getCheckerThreadNumber()); // uruchomienie wątków sprawdzających Klientów

		for(;;){} // i latamy sobie w kółko
  	}
  	catch (std::exception& e)
  	{
		std::cerr << "What a Terrible Failure: " << e.what() << "\n";
	}
	catch (int) // można ładniej ale działa
	{
		// drukuje helpa, ale gdzie indziej :)
	}

  	return 0;
}
